package com.mlh.binarytree;

/**
 * @author 缪林辉
 * @date 2024/4/3 11:02
 * @DESCRIPTION
 */
// 给你一个整数数组 nums ，其中元素已经按 升序 排列，请你将其转换为一棵 平衡 二叉搜索树。
public class 将有序数组转换为二叉搜索树 {
    //自己写出
    //思路：类似于二分查找，因为数组是有序的，
    // 并且要求二叉树是平衡的，所有去找中间位置数作为一个数的根节点，两边的数作为该节点的左子树和右子树
    //递归完成即可
    //递归参数：  数组  数组左界和右界
    //递归头： 左界>右界
    //递归体：找到数组中的middle 生成节点  然后递归生成其左子树和右子树 最后返回该节点
    public TreeNode method1(int[] nums) {
        return recursion(nums,0, nums.length-1);
    }

    public TreeNode recursion(int[] nums,int left,int right){
        if(left>right){
            return null;
        }
        int middle=(left+right)/2;
        TreeNode root=new TreeNode(nums[middle]);
        root.left=recursion(nums,left,middle-1);
        root.right=recursion(nums,middle+1,right);
        return root;
    }

    public TreeNode practice(int[] nums) {
        return practiceRecursion(0,nums.length-1,nums);
    }
    public TreeNode practiceRecursion(int left,int right,int[]nums){
        if(left>right){
            return null;
        }
        //找到中点
        int mid=(left+right)/2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left=practiceRecursion(left,mid-1,nums);
        node.right=practiceRecursion(mid+1,right,nums);
        return node;
    }

    public TreeNode practice2(int[] nums) {
        return practiceRecursion2(0,nums.length-1,nums);
    }

    public TreeNode practiceRecursion2(int left,int right,int[]nums){
        if(left>right){
            return null;
        }
        int mid=(left+right)/2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left=practiceRecursion2(left,mid-1,nums);
        node.right=practiceRecursion2(mid+1,right,nums);
        return node;
    }
}
